package com.lanmon.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Transactional("txManager") 配置该注解可以实现DAO中事物的控制。解决了增删改无法实现的问题2013-07-31
 * @author resigshy
 *
 * @param <T>
 * @param <PK>
 */
@Transactional("txManager")
public class HibernateService<T, PK extends Serializable>{
	private HibernateDao<T,PK> hibernateDao;
	
	public HibernateDao<T,PK> getHibernateDao() {
		return hibernateDao;
	}

	public void setHibernateDao(HibernateDao<T,PK> hibernateDao) {
		this.hibernateDao = hibernateDao;
	}

	public List<T> findAllObjects(){
		return hibernateDao.findAllObjects();
	}
	
	public T loadObject(final PK id) {
		return hibernateDao.loadObject(id);
	}
	
	public T getObject(final PK id) {
		return hibernateDao.getObject(id);
	}
	
	/**
	 * 保存新增或修改的对象.<br>
	 * 主键==null 时才能 insert =="" 无效<br>
	 * 使用前先判断id是否为Blank，是设置id=null
	 */
	public void saveOrUpdateObject(final T entity) {
		hibernateDao.saveOrUpdateObject(entity);
	}
	
	public void saveObject(final T entity) {
		hibernateDao.saveObject(entity);
	}
	
	public void updateObject(final T entity) {
		hibernateDao.updateObject(entity);
	}
	
	public void mergeObject(final T entity) {
		hibernateDao.mergeObject(entity);
	}
	
	/**
	 * 删除对象.
	 * 
	 * @param entity
	 *            对象必须是session中的对象或含id属性的transient对象.
	 */
	public void destroyObject(final T entity) {
		hibernateDao.destroyObject(entity);
	}
	
	/**
	 * 按id删除对象.<br>
	 * 先查出来，再删除,不推荐使用<br>
	 * 推荐执行hql删除
	 */
	public void destroyObject(final PK id) {
		hibernateDao.destroyObject(id);
	}
	
	/**
	 * 删除所有
	 * 
	 * @param entities
	 *            必须有id存在
	 */
	public void destroyAllObject(final Collection<?> entities) {
		hibernateDao.destroyAllObject(entities);
	}
	
	public void destroyAllObject(final String ids) {
		/*StringBuilder strIds = new StringBuilder();
		for (int i = 0; i < ids.length; i++) {
			if(i==0){
				strIds.append(ids[i]);
			}
			else {
				strIds.append(",").append(ids[i]);
			}
		}*/
		hibernateDao.destroyAllObject(ids.toString());
	}
		
	/**
	 * 获取全部对象,支持排序.
	 * 
	 * @param orderBy
	 * @param isAsc
	 * @return
	 */
	public List<T> findAllObjects(String orderBy, boolean isAsc) {
		return hibernateDao.findAllObjects(orderBy,isAsc);
	}
	
	/**
	 * 按属性查找对象列表,匹配方式为相等.
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public List<T> findObjectBy(final String propertyName, final Object value) {
		return hibernateDao.findObjectBy(propertyName,value);
	}
	
	/**
	 * 按属性查找唯一对象,匹配方式为相等.
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public T findUniqueObjectBy(final String propertyName, final Object value) {
		return hibernateDao.findUniqueObjectBy(propertyName,value);
	}
	
	/**
	 * 按id列表获取对象.
	 * 
	 * @param ids
	 * @return
	 */
	public List<T> findObjectByIds(List<PK> ids) {
		return hibernateDao.findObjectByIds(ids);
	}
	
	/**
	 * 按HQL查询对象列表.
	 * 
	 * @param values
	 *            数量可变的参数,按顺序绑定.
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<T> findObject(final String hql, final Object... values) {
		return hibernateDao.findObject(hql,values);
	}
	
	/**
	 * 按HQL查询对象列表.
	 * 
	 * @param values
	 *            命名参数,按名称绑定.
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<T> findObject(final String hql, final Map<String, ?> values) {
		return hibernateDao.findObject(hql,values);
	}
	
	/**
	 * 按HQL查询唯一对象.
	 * 
	 * @param values
	 *            数量可变的参数,按顺序绑定.
	 * @param hql
	 * @param values
	 * @return
	 */
	public T findUniqueObject(final String hql, final Object... values) {
		return hibernateDao.findUniqueObject(hql,values);
	}
	
	/**
	 * 按HQL查询唯一对象.
	 * 
	 * @param values
	 *            命名参数,按名称绑定.
	 * @param hql
	 * @param values
	 * @return
	 */
	public T findUniqueObject(final String hql, final Map<String, ?> values) {
		return hibernateDao.findUniqueObject(hql,values);
	}
	
	/**
	 * 执行HQL进行批量修改/删除操作.
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public int executeUpdate(final String hql, final Object... values) {
		return hibernateDao.executeUpdate(hql,values);
	}
	
	/**
	 * 执行HQL进行修改删除
	 * 
	 * @return 更新记录数
	 * @param hql
	 * @param values
	 * @return
	 */
	public int executeUpdate(final String hql, final Map<String, ?> values) {
		return hibernateDao.executeUpdate(hql,values);
	}
	
	/**
	 * 按Criteria查询对象列表.
	 * 
	 * @param criterions
	 *            数量可变的Criterion.
	 * @param criterions
	 * @return
	 */
	public List<T> findObjects(final Criterion... criterions) {
		return hibernateDao.findObjects(criterions);
	}
	
	/**
	 * 按Criteria查询唯一对象.
	 * 
	 * @param criterions
	 *            数量可变的Criterion.
	 * @param criterions
	 * @return
	 */
	public T findUniqueObject(final Criterion... criterions) {
		return hibernateDao.findUniqueObject(criterions);
	}
	
	/**
	 * 执行update delete 的HQL
	 * 
	 * @param hql
	 */
	public void executeUpdateHql(final String hql, Object[] values) {
		hibernateDao.executeUpdateHql(hql,values);
	}
	
	/**
	 * 执行update delete 的SQL
	 * 
	 * @param sql
	 */
	public void executeUpdateSql(final String sql, Object[] values) {
		hibernateDao.executeUpdateSql(sql,values);
	}
	
	public List<T> findListHql(String hql, Object[] values) {
		return hibernateDao.findListHql(hql,values);
	}
	
	/**
	 * 数组集合
	 * 
	 * @param sql
	 * @param values
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List findListSql(String sql, Object[] values) {
		return hibernateDao.findListSql(sql,values);
	}
	
	public void findFetchPage(DetachedCriteria detachedCriteria, PageEntity<T> page) {
		hibernateDao.findFetchPage(detachedCriteria,page);
	}
	
	public void findPageHql(String hql, Object[] values, PageEntity<T> page) {
		hibernateDao.findPageHql(hql,values,page);
	}
	
	@SuppressWarnings("rawtypes")
	public void findPageSql(String sql, Object[] values, PageEntity page) {
		hibernateDao.findPageSql(sql,values,page);
	}
	
	public List<T> findByExample(T t) throws Exception {
		return hibernateDao.findByExample(t);
	}
}
